/********************************************************************************
* @File name: mem_manage.h
* @Author: wzh
* @Version: 1.1
* @Date: 2021-8-14
* @Description: 内存管理算法，带有内存碎片合并算法，支持malloc、align_alloc、
*				realloc、free等常见的内存管理函数，支持多块内存合并管理，支持多线程
* @Todo	具体使用方法如下
*		 1、使用Mem_Manage_Heap_Init(Mem_Root* pRoot, const Mem_Region* pRigon)初始化
*			内存区，pRoot为句柄，pRigon描述了内存区个数以及内个内存区起始地址和大小
*			pRigon的格式如下
*			const Mem_Region pRigon[]=
*			{
*				(void*)(0x20000000),512*1024,
*				(void*)(0x80000000),256*1024,
*				....
*				NULL,0
*			}
*			注意地址必需由低到高排列，同时使用NULL，0标识结尾，内存区容量不要太小，至少大于64个字节
*			推荐内存区地址与内存区大小8字节对齐，这样会减少对齐操作对内存的损耗
*		 2、使用Mem_Manage_Malloc、Mem_Manage_Realloc、Mem_Manage_Align_Alloc进行内存
*			分配，其中Mem_Manage_Malloc、Mem_Manage_Realloc默认均为8字节对齐，可修改
*			.c文件中的宏定义修改，Mem_Manage_Align_Alloc可以指定地址对齐，但对齐的参数
*			有限制，align_size需要为2的整数次幂，否则会直接返回NULL。
*		 3、内存使用完毕后使用Mem_Manage_Free进行内存释放
*		 4、可通过Mem_Manage_Get_State查看内存使用情况，通过句柄Mem_Root成员total_size获取总内存量，
*			通过Mem_State成员remain_size获取内存剩余量
*		 5、使用默认的8字节对齐有助于减少小内存块，进而提高内存利用率
*		 6、目前最小内存块控制为16字节，可通过.c文件进行修改
*		 7、算法中使用了块大小标识的最高位作为分配标记，可在一定程度上检验非法释放，
*			但这也使得内存管理的最大内存限制为2GB（32位机）
********************************************************************************/
#ifndef MEM_MANAGE_H_
#define MEM_MANAGE_H_

#include "user_type.h"
//#define MEM_MANAGE_LOCK()
//#define MEM_MANAGE_UNLOCK()
#define MEM_MANAGE_ASSERT(A)					if(!(A))printf("MEM_MANAGE Malloc Error:%s,%d\r\n",__FILE__,__LINE__)
#define MEM_MANAGE_MALLOC_FAIL()				printf("MEM_MANAGE Malloc Fail:%s,%d\r\n",__FILE__,__LINE__)

#ifndef MEM_MANAGE_LOCK
#define MEM_MANAGE_LOCK()
#endif

#ifndef MEM_MANAGE_UNLOCK
#define MEM_MANAGE_UNLOCK()
#endif

#ifndef MEM_MANAGE_ASSERT
#define MEM_MANAGE_ASSERT(A)			((void)(A))
#endif

#ifndef MEM_MANAGE_MALLOC_FAIL
#define MEM_MANAGE_MALLOC_FAIL()		
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef struct Mem_Region {
	void*	addr;//内存区起始地址
	size_t	mem_size;//内存大小
}Mem_Region;

typedef struct Mem_Node {
	struct Mem_Node* next_node;
	size_t mem_size;
}Mem_Node;

typedef struct Mem_Root {
	Mem_Node* pStart;
	Mem_Node* pEnd;
	size_t total_size;		//总内存
}Mem_Root;

typedef struct Mem_State {
	size_t remain_size;		//内存剩余量
	size_t free_node_num;	//空闲节点个数
	size_t max_node_size;	//最大节点内存
	size_t min_node_size;	//最小节点内存
}Mem_State;

void* Mem_Manage_Align_Alloc(Mem_Root* pRoot, size_t align_size, size_t want_size);
void* Mem_Manage_Malloc(Mem_Root* pRoot, size_t want_size);
void* Mem_Manage_Realloc(Mem_Root* pRoot, void* src_addr, size_t want_size);
void Mem_Manage_Free(Mem_Root* pRoot, void* addr);
void Mem_Manage_Heap_Init(Mem_Root* pRoot, const Mem_Region* pRigon);
void Mem_Manage_Get_State(Mem_Root* pRoot, Mem_State* pState);
#ifdef __cplusplus
}
#endif

#endif
